package com.developteam.xnmall.service.impl;

import com.github.wxpay.sdk.WXPay;
import com.developteam.xnmall.dao.OrdersMapper;
import com.developteam.xnmall.entity.Orders;
import com.developteam.xnmall.service.OrderService;
import com.developteam.xnmall.service.job.MyPayConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * Description:
 * Author: ZhangXirong 27216
 * Version: 1.0
 * Create Date Time: 2022/3/21 23:17.
 * Update Date Time:
 *
 * @see
 */

@Service
@RabbitListener(queues = "q2")
public class ReceiveMsgFromMQService {
    @Autowired
    private OrdersMapper ordersMapper;
    @Autowired
    private OrderService orderService;

    private WXPay wxPay = new WXPay(new MyPayConfig());

    //    @Scheduled(cron = "0/60 * * * * ?")  不需要每隔一分钟去扫表
    //不需要定时任务了, 要监听MQ
    @RabbitHandler  //不用一个一个遍历了
    public void checkAndCloseOrder(String orderId, Channel channel, Message message) throws IOException {
        System.out.println("-------------------查询是否购买");
        try {
//一\根据订单编号去数据库中查询当前订单信息,
            Orders order = ordersMapper.selectByPrimaryKey(orderId);
            if ("1".equals(order.getStatus())) { //拿着订单编号去微信查, 1是未支付
                HashMap<String, String> params = new HashMap<>();
                params.put("out_trade_no", order.getOrderId());  //具体订单号

                Map<String, String> resp = wxPay.orderQuery(params);   //得到的resp是订单的状态

                if ("SUCCESS".equalsIgnoreCase(resp.get("trade_state"))) {
                    //2.1 如果订单已经支付，则修改订单状态为"代发货/已支付"  status = 2
                    Orders updateOrder = new Orders();
                    updateOrder.setOrderId(order.getOrderId());
                    updateOrder.setStatus("2");
                    ordersMapper.updateByPrimaryKeySelective(updateOrder);
                } else if ("NOTPAY".equalsIgnoreCase(resp.get("trade_state"))) {
                    //2.2 如果确实未支付 则取消订单：
                    //  a.向微信支付平台发送请求，关闭当前订单的支付链接
                    Map<String, String> map = wxPay.closeOrder(params);
                    System.out.println(map);
                    // b.关闭订单
                    orderService.closeOrder(order.getOrderId());

                    //要让这两步操作保证原子性【一起成功，一起失败】，一致性【关闭订单那库存就一定要还原，否则数据库不一致】
                    //  1.修改当前订单：status=6 已关闭  close_type=1 超时未支付
                    //  2.还原库存，根据当前订单编号查询商品快照--》修改product_sku
                }
//二\订单处理完了,消费者手动ack
                //long var1 ---- 这条消息的索引 < 参数值的都会被删除,表示参数值之前的所有消息都成功了
                //boolean var3 ----- 是否批量处理
                // 业务处理完毕手动应答,确保消息消费成功,但是会存在并发问题[消息处理完毕还没有手动ack的时候,集群的消费者也读到了这条消息,redis解决]
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);  //false,不管其他订单编号

            }
        } catch (Exception e) {
            e.printStackTrace();
            //boolean var4 ----- 消息要不要回到队列,就是要不要删除[被拒绝的消息重新入队列]
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }
    }

}
//1.查询超过30min订单状态依然为待支付状态的订单
            /*Example example = new Example(Orders.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("status", "1");
            Date time = new Date(System.currentTimeMillis() - 30 * 60 * 1000);
            criteria.andLessThan("createTime", time);
            List<Orders> orders = ordersMapper.selectByExample(example);    //只是可能超时的订单

            //2.访问微信平台接口，确认当前订单最终的支付状态
            for (int i = 0; i < orders.size(); i++) {
                Orders order = orders.get(i);
                HashMap<String, String> params = new HashMap<>();
                params.put("out_trade_no", order.getOrderId());  //具体订单号

                Map<String, String> resp = wxPay.orderQuery(params);   //得到的resp是订单的状态

                if ("SUCCESS".equalsIgnoreCase(resp.get("trade_state"))) {
                    //2.1 如果订单已经支付，则修改订单状态为"代发货/已支付"  status = 2
                    Orders updateOrder = new Orders();
                    updateOrder.setOrderId(order.getOrderId());
                    updateOrder.setStatus("2");
                    ordersMapper.updateByPrimaryKeySelective(updateOrder);
                } else if ("NOTPAY".equalsIgnoreCase(resp.get("trade_state"))) {
                    //2.2 如果确实未支付 则取消订单：
                    //  a.向微信支付平台发送请求，关闭当前订单的支付链接
                    Map<String, String> map = wxPay.closeOrder(params);
                    System.out.println(map);
                    // b.关闭订单
                    orderService.closeOrder(order.getOrderId());

                    //要让这两步操作保证原子性【一起成功，一起失败】，一致性【关闭订单那库存就一定要还原，否则数据库不一致】
                    //  1.修改当前订单：status=6 已关闭  close_type=1 超时未支付
                    //  2.还原库存，根据当前订单编号查询商品快照--》修改product_sku

                }
                */